package com.sysd.server.handler.base;

import com.sysd.server.container.AttrContainer;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;

/**
 * @description:
 * @author: bsh
 * @date: 2025/6/14 13:26
 */
@Slf4j
public abstract class AbstractMessageHandler<T> extends AbstractBaseHandler<T> {
    /**
     * @param channelHandlerContext 上下文
     * @param t                     参数
     */
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, T t) {
        if (channelContainer.auth(channelHandlerContext)) {
            this.channelRead1(channelHandlerContext, t);
            return;
        }
        log.error("消息发送失败：鉴权失败或者其他原因!");
        channelHandlerContext.channel().close();
    }

    /**
     * @param ctx 上下文
     * @param evt 事件
     * @throws Exception 异常
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state() == IdleState.READER_IDLE) {
                log.warn("服务端已经长时间没有收到客户端的消息了!");
                channelContainer.removeChatChannel(ctx);
            }
        }
        //去处理连接成功后的消息
        if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {
            Channel c = ctx.channel();
            Integer userId = c.attr(AttrContainer.channelUserIdAttr).get();
            if (null != userId) {
                channelContainer.putChatChannel(userId, c);
            }
        }
    }

    /**
     * 重连机制 不确定是否需要自动重连
     *
     * @param ctx 上下文
     * @throws Exception 异常
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {

    }
}
